/**
 * 商品管理API服务
 * 提供商品相关的所有API操作
 */

import { BaseService } from '../base-service.js';
import { API_ENDPOINTS } from '../config.js';

class ProductService extends BaseService {
  constructor() {
    super(API_ENDPOINTS.PRODUCTS.LIST.replace('/products', '/products'));
  }

  /**
   * 获取商品列表
   * @param {object} params - 查询参数
   * @param {number} params.page - 页码
   * @param {number} params.pageSize - 每页数量
   * @param {string} params.search - 搜索关键词
   * @param {string} params.categoryId - 分类ID筛选
   * @param {string} params.status - 状态筛选
   * @param {number} params.minPrice - 最低价格
   * @param {number} params.maxPrice - 最高价格
   * @param {string} params.sortBy - 排序字段
   * @param {string} params.sortOrder - 排序方向
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 商品列表数据
   */
  async getProducts(params = {}, options = {}) {
    return this.getList(params, options);
  }

  /**
   * 获取商品详情
   * @param {string|number} id - 商品ID
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 商品详情
   */
  async getProduct(id, options = {}) {
    return this.getDetail(id, options);
  }

  /**
   * 创建商品
   * @param {object} productData - 商品数据
   * @param {string} productData.name - 商品名称
   * @param {number} productData.price - 价格
   * @param {number} productData.original_price - 原价
   * @param {string} productData.description - 商品描述
   * @param {string} productData.category_id - 分类ID
   * @param {number} productData.stock - 库存
   * @param {Array} productData.tags - 标签
   * @param {string} productData.status - 状态
   * @param {Array} productData.images - 图片URL数组
   * @param {Array} productData.specifications - 规格参数
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 创建结果
   */
  async createProduct(productData, options = {}) {
    return this.create(productData, options);
  }

  /**
   * 更新商品
   * @param {string|number} id - 商品ID
   * @param {object} productData - 商品数据
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 更新结果
   */
  async updateProduct(id, productData, options = {}) {
    return this.update(id, productData, options);
  }

  /**
   * 更新商品状态
   * @param {string|number} id - 商品ID
   * @param {string} status - 新状态 (active, inactive, draft)
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 更新结果
   */
  async updateProductStatus(id, status, options = {}) {
    return this.patch(id, { 
      status,
      status_changed_at: new Date().toISOString()
    }, options);
  }

  /**
   * 更新商品库存
   * @param {string|number} id - 商品ID
   * @param {number} stock - 库存数量
   * @param {string} operation - 操作类型 (set, add, subtract)
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 更新结果
   */
  async updateProductStock(id, stock, operation = 'set', options = {}) {
    return this.patch(id, { 
      stock,
      stock_operation: operation,
      stock_updated_at: new Date().toISOString()
    }, options);
  }

  /**
   * 删除商品
   * @param {string|number} id - 商品ID
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 删除结果
   */
  async deleteProduct(id, options = {}) {
    return this.delete(id, options);
  }

  /**
   * 批量删除商品
   * @param {Array<string|number>} ids - 商品ID数组
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 删除结果
   */
  async batchDeleteProducts(ids, options = {}) {
    return this.batchDelete(ids, options);
  }

  /**
   * 批量更新商品状态
   * @param {Array<string|number>} ids - 商品ID数组
   * @param {string} status - 新状态
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 更新结果
   */
  async batchUpdateProductStatus(ids, status, options = {}) {
    const updates = ids.map(id => ({
      id,
      data: { 
        status,
        status_changed_at: new Date().toISOString()
      }
    }));
    return this.batchUpdate(updates, options);
  }

  /**
   * 获取商品统计信息
   * @param {object} params - 统计参数
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 统计数据
   */
  async getProductStats(params = {}, options = {}) {
    return this.getStats(params, options);
  }

  /**
   * 获取商品分类列表
   * @param {object} params - 查询参数
   * @param {object} options - 请求选项
   * @returns {Promise<Array>} 分类列表
   */
  async getCategories(params = {}, options = {}) {
    return this.getList('/categories', params, options);
  }

  /**
   * 获取商品分类树
   * @param {object} options - 请求选项
   * @returns {Promise<Array>} 分类树
   */
  async getCategoryTree(options = {}) {
    return this.getDetail('/categories/tree', options);
  }

  /**
   * 创建商品分类
   * @param {object} categoryData - 分类数据
   * @param {string} categoryData.name - 分类名称
   * @param {string} categoryData.parent_id - 父分类ID
   * @param {string} categoryData.description - 分类描述
   * @param {number} categoryData.sort_order - 排序
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 创建结果
   */
  async createCategory(categoryData, options = {}) {
    return this.create('/categories', categoryData, options);
  }

  /**
   * 更新商品分类
   * @param {string|number} id - 分类ID
   * @param {object} categoryData - 分类数据
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 更新结果
   */
  async updateCategory(id, categoryData, options = {}) {
    return this.update(`/categories/${id}`, categoryData, options);
  }

  /**
   * 删除商品分类
   * @param {string|number} id - 分类ID
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 删除结果
   */
  async deleteCategory(id, options = {}) {
    return this.delete(`/categories/${id}`, options);
  }

  /**
   * 上传商品图片
   * @param {string|number} productId - 商品ID
   * @param {File|FileList} files - 图片文件
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 上传结果
   */
  async uploadProductImages(productId, files, options = {}) {
    return this.uploadFiles(productId, files, options);
  }

  /**
   * 删除商品图片
   * @param {string|number} productId - 商品ID
   * @param {string} imageId - 图片ID
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 删除结果
   */
  async deleteProductImage(productId, imageId, options = {}) {
    return this.deleteFile(productId, imageId, options);
  }

  /**
   * 获取商品图片列表
   * @param {string|number} productId - 商品ID
   * @param {object} options - 请求选项
   * @returns {Promise<Array>} 图片列表
   */
  async getProductImages(productId, options = {}) {
    return this.getFiles(productId, options);
  }

  /**
   * 设置商品主图
   * @param {string|number} productId - 商品ID
   * @param {string} imageId - 图片ID
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 设置结果
   */
  async setPrimaryImage(productId, imageId, options = {}) {
    return this.patch(productId, { 
      primary_image_id: imageId,
      primary_image_updated_at: new Date().toISOString()
    }, options);
  }

  /**
   * 获取商品SKU列表
   * @param {string|number} productId - 商品ID
   * @param {object} options - 请求选项
   * @returns {Promise<Array>} SKU列表
   */
  async getProductSkus(productId, options = {}) {
    return this.getDetail(`${productId}/skus`, options);
  }

  /**
   * 创建商品SKU
   * @param {string|number} productId - 商品ID
   * @param {object} skuData - SKU数据
   * @param {string} skuData.sku_code - SKU编码
   * @param {number} skuData.price - 价格
   * @param {number} skuData.stock - 库存
   * @param {object} skuData.attributes - 属性
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 创建结果
   */
  async createProductSku(productId, skuData, options = {}) {
    return this.create(`${productId}/skus`, skuData, options);
  }

  /**
   * 更新商品SKU
   * @param {string|number} productId - 商品ID
   * @param {string|number} skuId - SKU ID
   * @param {object} skuData - SKU数据
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 更新结果
   */
  async updateProductSku(productId, skuId, skuData, options = {}) {
    return this.update(`${productId}/skus/${skuId}`, skuData, options);
  }

  /**
   * 删除商品SKU
   * @param {string|number} productId - 商品ID
   * @param {string|number} skuId - SKU ID
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 删除结果
   */
  async deleteProductSku(productId, skuId, options = {}) {
    return this.delete(`${productId}/skus/${skuId}`, options);
  }

  /**
   * 复制商品
   * @param {string|number} productId - 商品ID
   * @param {object} copyData - 复制配置
   * @param {string} copyData.name - 新商品名称
   * @param {boolean} copyData.copy_images - 是否复制图片
   * @param {boolean} copyData.copy_skus - 是否复制SKU
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 复制结果
   */
  async copyProduct(productId, copyData, options = {}) {
    return this.create(`${productId}/copy`, copyData, options);
  }

  /**
   * 获取商品销售数据
   * @param {string|number} productId - 商品ID
   * @param {object} params - 查询参数
   * @param {string} params.startDate - 开始日期
   * @param {string} params.endDate - 结束日期
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 销售数据
   */
  async getProductSalesData(productId, params = {}, options = {}) {
    return this.getDetail(`${productId}/sales-data`, {
      query: params,
      ...options,
    });
  }

  /**
   * 获取热门商品
   * @param {object} params - 查询参数
   * @param {number} params.limit - 数量限制
   * @param {string} params.period - 时间周期
   * @param {object} options - 请求选项
   * @returns {Promise<Array>} 热门商品列表
   */
  async getPopularProducts(params = {}, options = {}) {
    return this.getList('/popular', params, options);
  }

  /**
   * 获取推荐商品
   * @param {string|number} productId - 商品ID
   * @param {object} params - 查询参数
   * @param {number} params.limit - 数量限制
   * @param {object} options - 请求选项
   * @returns {Promise<Array>} 推荐商品列表
   */
  async getRecommendedProducts(productId, params = {}, options = {}) {
    return this.getDetail(`${productId}/recommendations`, {
      query: params,
      ...options,
    });
  }

  /**
   * 导出商品数据
   * @param {object} params - 导出参数
   * @param {Array} params.ids - 商品ID数组
   * @param {string} params.format - 导出格式 (excel, csv)
   * @param {object} options - 请求选项
   * @returns {Promise<Blob>} 导出文件
   */
  async exportProducts(params = {}, options = {}) {
    return this.export(params, options);
  }

  /**
   * 导入商品数据
   * @param {File} file - 导入文件
   * @param {object} options - 请求选项
   * @returns {Promise<object>} 导入结果
   */
  async importProducts(file, options = {}) {
    return this.import(file, options);
  }
}

// 创建单例实例
export const productService = new ProductService();

export default ProductService;
